//! `std::slice` 模块的功能示例
//!
//! `slicex` 模块主要演示了 Rust 中切片（slice）的创建、访问和基本操作。

/// # `std::slice` 示例
///
/// 这个函数展示了如何创建和使用切片。
#[allow(dead_code)]
pub fn stdx_slice_examples() {
    // --- 创建切片 ---

    // 从数组创建切片
    let arr = [1, 2, 3, 4, 5];
    let slice_from_array: &[i32] = &arr;
    println!("从数组创建的切片: {:?}", slice_from_array);

    // 从向量 (Vec) 创建切片
    let vec = vec![6, 7, 8, 9, 10];
    let slice_from_vec: &[i32] = &vec;
    println!("从向量创建的切片: {:?}", slice_from_vec);

    // 创建一个包含部分元素的切片（子切片）
    let sub_slice = &arr[1..4]; // 包含索引 1, 2, 3 的元素
    println!("子切片: {:?}", sub_slice); // 输出: [2, 3, 4]

    // --- 访问切片元素 ---

    // 获取第一个元素
    let first = slice_from_array.first();
    assert_eq!(first, Some(&1));
    println!("第一个元素: {:?}", first);

    // 获取最后一个元素
    let last = slice_from_array.last();
    assert_eq!(last, Some(&5));
    println!("最后一个元素: {:?}", last);

    // 通过索引访问元素
    let third_element = slice_from_array[2];
    assert_eq!(third_element, 3);
    println!("通过索引访问第三个元素: {}", third_element);

    // 使用 `get` 方法安全地访问元素，避免越界 panic
    let element_at_index_10 = slice_from_array.get(10);
    assert_eq!(element_at_index_10, None);
    println!("索引 10 处的元素: {:?}", element_at_index_10);

    // --- 切片常用方法 ---

    // 获取切片长度
    println!("切片长度: {}", slice_from_array.len());

    // 检查切片是否为空
    println!("切片是否为空: {}", slice_from_array.is_empty());

    // 检查切片是否包含某个元素
    println!("切片是否包含 3: {}", slice_from_array.contains(&3));
    println!("切片是否包含 99: {}", slice_from_array.contains(&99));

    // --- 可变切片 ---

    let mut mutable_arr = [10, 20, 30, 40, 50];
    let mutable_slice: &mut [i32] = &mut mutable_arr;

    // 修改切片中的元素
    mutable_slice[0] = 100;
    println!("修改后的可变切片: {:?}", mutable_slice);

    // `swap` 方法交换两个元素的位置
    mutable_slice.swap(1, 3);
    println!("交换元素后的可变切片: {:?}", mutable_slice); // [100, 40, 30, 20, 50]

    // `reverse` 方法反转切片中元素的顺序
    mutable_slice.reverse();
    println!("反转后的可变切片: {:?}", mutable_slice); // [50, 20, 30, 40, 100]

    // --- 其他切片操作 ---

    // 遍历切片
    for (i, v) in slice_from_array.iter().enumerate() {
        println!("第{}个元素: {}", i, v);
    }

    // 切片分割
    let (left, right) = slice_from_array.split_at(2);
    println!("分割后的左边: {:?}", left); // 输出: [1, 2]
    println!("分割后的右边: {:?}", right); // 输出: [3, 4, 5]

    // 切片排序（需要可变引用）
    let mut arr2 = [5, 3, 1, 4, 2];
    arr2.sort();
    println!("排序后的数组: {:?}", arr2);

    // 切片转换为 Vec
    let vec_from_slice = slice_from_array.to_vec();
    println!("切片转换为 Vec: {:?}", vec_from_slice);

    // 切片反转
    let mut arr3 = [1, 2, 3, 4, 5];
    arr3.reverse();
    println!("反转后的数组: {:?}", arr3);
}
